# 函数递归
# 写一个函数，求 n 的阶乘
# def factor(n):
#     result = 1
#     for i in range(1, n+1):
#         result *= i
#     return result


# n! => n*(n-1)!
# 1! => 1
# 虽然都是n ，但是n是函数形参，形参相当于函数的 局部变量！！
# 局部变量在函数自己的栈帧上的！！
# 虽然两个函数的局部变量名相同，但是不同的栈帧，是不同的内存空间，也就是不同的变量了
def factor(n):
    if n == 1:
        return 1
    return n * factor(n - 1)


print(factor(5))
# 递归代码有两个要素：1、递归结束条件 2、递归的递推公式
# 递归的缺点： 1、执行过程非常复杂，难以理解 2、代码容易出现“栈溢出”的情况 3、递归代码一般不能都是可以转换成等价的循环代码

